#pragma once

#include <memory>
#include <string>
#include <vector>

#include <ros/builtin_message_traits.h>
#include <ros/message_operations.h>
#include <ros/serialization.h>
#include <ros/types.h>

#include "@PROTO_H@ActionGoal.h"
#include "@PROTO_H@ActionFeedback.h"
#include "@PROTO_H@ActionResult.h"

namespace @Package@ {
template <class ContainerAllocator>
    struct @PROTO_H@Action_ {
        typedef @PROTO_H@Action_<ContainerAllocator> Type;

        @PROTO_H@Action_() : action_goal(), action_result(), action_feedback() {
        }
        @PROTO_H@Action_(const ContainerAllocator &_alloc) : action_goal(_alloc), action_result(_alloc), action_feedback(_alloc) {
            (void)_alloc;
        }

        typedef ::@Package@::@PROTO_H@ActionGoal_<ContainerAllocator> _action_goal_type;
        _action_goal_type action_goal;

        typedef ::@Package@::@PROTO_H@ActionResult_<ContainerAllocator> _action_result_type;
        _action_result_type action_result;

        typedef ::@Package@::@PROTO_H@ActionFeedback_<ContainerAllocator> _action_feedback_type;
        _action_feedback_type action_feedback;

        typedef boost::shared_ptr<::@Package@::@PROTO_H@Action_<ContainerAllocator>> Ptr;
        typedef boost::shared_ptr<::@Package@::@PROTO_H@Action_<ContainerAllocator> const> ConstPtr;
    }; // struct @PROTO_H@Action_

    typedef ::@Package@::@PROTO_H@Action_<std::allocator<void>> @PROTO_H@Action;

    typedef boost::shared_ptr<::@Package@::@PROTO_H@Action> @PROTO_H@ActionPtr;
    typedef boost::shared_ptr<::@Package@::@PROTO_H@Action const> @PROTO_H@ActionConstPtr;
} // namespace @Package@

namespace ros { namespace message_traits {
    template <class ContainerAllocator>
    struct MD5Sum<::@Package@::@PROTO_H@Action_<ContainerAllocator>> {
        static const char *value() {
            return "@Checksum@";
        }

        static const char *value(const ::@Package@::@PROTO_H@Action_<ContainerAllocator> &) {
            return value();
        }
    };

    template <class ContainerAllocator>
    struct DataType<::@Package@::@PROTO_H@Action_<ContainerAllocator>> {
        static const char *value() {
            return "@Package@/@PROTO_H@Action";
        }

        static const char *value(const ::@Package@::@PROTO_H@Action_<ContainerAllocator> &) {
            return value();
        }
    };
}} // namespace ros::message_traits

namespace ros { namespace serialization {
template <class ContainerAllocator>
    struct Serializer<::@Package@::@PROTO_H@Action_<ContainerAllocator>> {
        template <typename Stream, typename T>
        inline static void allInOne(Stream &stream, T m) {
            stream.next(m.action_goal);
            stream.next(m.action_result);
            stream.next(m.action_feedback);
        }

        ROS_DECLARE_ALLINONE_SERIALIZER
    }; // struct @PROTO_H@Action_
}} // namespace ros::serialization
